// Have include guard.
#ifndef FPK_TANKSTRAFEDRIVEFILTER_HPP
#define FPK_TANKSTRAFEDRIVEFILTER_HPP

#include "../Filter.hpp"
#include "../../Values/TwoJoystickValue.hpp"
#include "../../Values/CartesianValue.hpp"

/**
 *  The TankStrafeDriveFilter class is a filter that converts from a TwoJoystickValue to a CartesianValue using tank strafe drive (previously known as tank drive with passive mecanum).
 *  
 *  This is intended to be used with MecanumDriveSubsystem.
 *  To go forward/backward, push both joysticks forward/backward, respectively.
 *  To turn left/right, push forward on the left/right joystick and backward on the right/left joystick, respectively.
 *  To move (or strafe) left/right, push both joysticks to the left/right, respectively.
 *  If you like tank style controls and you are using mecanum, you might want to try this.
 */
class TankStrafeDriveFilter :
	public Filter<TwoJoystickValue, CartesianValue>
{
	public:
		/**
		 *  Apply the filter to an input.
		 */
		virtual CartesianValue Apply(const TwoJoystickValue &input) const;
};

#endif // #ifndef FPK_TANKSTRAFEDRIVEFILTER_HPP
